//package com.ruoyi.interceptor;
//
//import com.ruoyi.framework.config.MapperLimit;
//import org.apache.ibatis.executor.parameter.ParameterHandler;
//import org.apache.ibatis.mapping.MappedStatement;
//import org.apache.ibatis.plugin.Interceptor;
//import org.apache.ibatis.plugin.Intercepts;
//import org.apache.ibatis.plugin.Invocation;
//import org.apache.ibatis.plugin.Plugin;
//import org.apache.ibatis.plugin.Signature;
//import org.apache.ibatis.reflection.DefaultReflectorFactory;
//import org.apache.ibatis.reflection.MetaObject;
//import org.apache.ibatis.reflection.ReflectorFactory;
//import org.apache.ibatis.reflection.factory.DefaultObjectFactory;
//import org.apache.ibatis.reflection.factory.ObjectFactory;
//import org.apache.ibatis.reflection.wrapper.DefaultObjectWrapperFactory;
//import org.apache.ibatis.reflection.wrapper.ObjectWrapperFactory;
//import org.springframework.stereotype.Component;
//
//import java.lang.reflect.Method;
//import java.sql.PreparedStatement;
//import java.util.Properties;
//
//import lombok.extern.slf4j.Slf4j;
//
//@Slf4j
//@Component
//@Intercepts({
//    @Signature(type = ParameterHandler.class,
//        method = "setParameters",
//        args = PreparedStatement.class),
//})
//public class SM4MACInterceptor implements Interceptor {
//
//    private static final ObjectFactory DEFAULT_OBJECT_FACTORY = new DefaultObjectFactory();
//    private static final ObjectWrapperFactory DEFAULT_OBJECT_WRAPPER_FACTORY = new DefaultObjectWrapperFactory();
//    private static final ReflectorFactory REFLECTOR_FACTORY = new DefaultReflectorFactory();
//
//    @Override
//    public Object intercept(Invocation invocation) throws Throwable {
//
//        // 重点！！！ 获取Mapper方法上的注解
//        ParameterHandler resultSetHandler = (ParameterHandler) invocation.getTarget();
//        MetaObject metaResultSetHandler = MetaObject.forObject(resultSetHandler, DEFAULT_OBJECT_FACTORY, DEFAULT_OBJECT_WRAPPER_FACTORY, REFLECTOR_FACTORY);
//        MappedStatement mappedStatement = (MappedStatement) metaResultSetHandler.getValue("mappedStatement");
//        MapperLimit annotation = getMapperLimit(mappedStatement);
//        // 注解上配置的加密字段，拿到 !
//        String[] fields = annotation.fieldKey();
//        // 省略根据 fields 后做的加密，然后再做对象参数的反射......
//
//        // 执行
//        Object result = invocation.proceed();
//
//        // 返回结果
//        return result;
//    }
//
//    /**
//     * 获取方法上的MapperLimit注解
//     *
//     * @param mappedStatement MappedStatement
//     * @return EncryptResultFieldAnnotation注解
//     */
//    private MapperLimit getMapperLimit(MappedStatement mappedStatement) {
//        MapperLimit annotation = null;
//        try {
//            String id = mappedStatement.getId();
//            String className = id.substring(0, id.lastIndexOf("."));
//            String methodName = id.substring(id.lastIndexOf(".") + 1);
//            final Method[] method = Class.forName(className).getMethods();
//            for (Method me : method) {
//                if (me.getName().equals(methodName) && me.isAnnotationPresent(MapperLimit.class)) {
//                    return me.getAnnotation(MapperLimit.class);
//                }
//            }
//        } catch (Exception ex) {
//            log.error("", ex);
//        }
//        return annotation;
//    }
//
//    @Override
//    public Object plugin(Object o) {
//        return Plugin.wrap(o, this);
//    }
//
//    @Override
//    public void setProperties(Properties properties) {
//
//    }
//}
